package com.anabur.bean;

import java.io.File;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.anabur.bean.abstracts.AbstractImportBean;
import com.anabur.bean.table.CotizacionTableItem;
import com.anabur.dao.DAOFactory;
import com.anabur.persistent.Cotizacion;
import com.anabur.persistent.Empresa;
import com.anabur.system.AafPropertyReader;
import com.anabur.system.PropertyConstant;


@ManagedBean(name="cotizacionBean")
@SessionScoped
public class CotizacionBean extends AbstractImportBean {
	
	private static final long serialVersionUID = 1L;

	public final static Integer COLUMN_FIRST_ITEM = 0;
	public final static String TAG_ROW = "Row";
	private Map<String, Integer> propertyPositionMap;
	private Map<String, List<String>> propertyMap;
	private Integer filaEncabezados;
	private String formatoFecha;
	
	private void reloadProperties() throws Exception{
		List<String> empresaProperties = new ArrayList<String>();
		List<String> fechaProperties = new ArrayList<String>();
		List<String> precioProperties = new ArrayList<String>();
		AafPropertyReader propertyReader = new AafPropertyReader();
		boolean foundPropertie = true;
		int iteracion = 1;
		while(foundPropertie){
			if(iteracion == 1){
				String empresaProperty = propertyReader.getProperty(PropertyConstant.COTIZACION_EMPRESA_PROP); 
				empresaProperties.add(empresaProperty.replaceAll("\uFFFD", " "));
				String fechaProperty = propertyReader.getProperty(PropertyConstant.COTIZACION_FECHA_PROP);
				fechaProperties.add(fechaProperty.replaceAll("\uFFFD", " "));
				String precioProperty = propertyReader.getProperty(PropertyConstant.COTIZACION_PRECIO_PROP);
				precioProperties.add(precioProperty.replaceAll("\uFFFD", " "));
			} else {
				try{
					String empresaProperty = propertyReader.getProperty(PropertyConstant.COTIZACION_EMPRESA_PROP+ "_" + iteracion); 
					empresaProperties.add(empresaProperty.replaceAll("\uFFFD", " "));
					String fechaProperty = propertyReader.getProperty(PropertyConstant.COTIZACION_FECHA_PROP+ "_" + iteracion);
					fechaProperties.add(fechaProperty.replaceAll("\uFFFD", " "));
					String precioProperty = propertyReader.getProperty(PropertyConstant.COTIZACION_PRECIO_PROP+ "_" + iteracion);
					precioProperties.add(precioProperty.replaceAll("\uFFFD", " "));
				}catch (Exception e) {
					foundPropertie = false;
				}
			}
			iteracion++;
		}
		
		propertyMap = new HashMap<String, List<String>>();
		propertyMap.put(Cotizacion.EMPRESA, empresaProperties);
		propertyMap.put(Cotizacion.FECHA, fechaProperties);
		propertyMap.put(Cotizacion.PRECIO, precioProperties);
		
		propertyPositionMap = new HashMap<String, Integer>();
		propertyPositionMap.put(Cotizacion.EMPRESA, -1);
		propertyPositionMap.put(Cotizacion.FECHA, -1);
		propertyPositionMap.put(Cotizacion.PRECIO, -1);
		
		filaEncabezados = Integer.valueOf(propertyReader.getProperty(PropertyConstant.FILA_ENCABEZADOS));
		formatoFecha = propertyReader.getProperty(PropertyConstant.FORMATO_FECHA);
		
	}
	
	public void importFile(File file){
		Boolean isComplete = true;
		String codigoEmpresa = null;
		Empresa empresa = null;
		Integer filasImportadas = 0;
		Integer filasNoImportadas = 0;
		try {
			reloadProperties();
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(file);
			doc.getDocumentElement().normalize();
			NodeList rowNodeList = doc.getElementsByTagName(TAG_ROW);
			for (int i = 0; i < rowNodeList.getLength(); i++) {
				Node rowNode = rowNodeList.item(i);
				if(i == filaEncabezados){ // primera row donde estan los encabezados
					parseHeaderColumn(rowNode);
					validatePropertyPosition(propertyPositionMap);
				} else { // resto del conjunto de rows
					if (rowNode.getNodeType() == Node.ELEMENT_NODE){
						NodeList cellNodeList = rowNode.getChildNodes();
						String stringFecha = cellNodeList.item(propertyPositionMap.get(Cotizacion.FECHA)).getChildNodes().item(COLUMN_FIRST_ITEM).getTextContent();
						String stringPrecioCierre = cellNodeList.item(propertyPositionMap.get(Cotizacion.PRECIO)).getChildNodes().item(COLUMN_FIRST_ITEM).getTextContent();
						codigoEmpresa = cellNodeList.item(propertyPositionMap.get(Cotizacion.EMPRESA)).getChildNodes().item(COLUMN_FIRST_ITEM).getTextContent();	
						empresa = DAOFactory.getInstance().getEmpresaDAO().getEmpresaByCodigo(codigoEmpresa);
						if(empresa != null){
							Cotizacion cotizacion = null;
							SimpleDateFormat formatDate = new SimpleDateFormat(formatoFecha);
							if(getIsBigdecimal(stringPrecioCierre)){
								cotizacion = new Cotizacion(new BigDecimal(stringPrecioCierre),formatDate.parse(stringFecha), empresa);
								if(getReWrite()){
									cotizacion.setID(DAOFactory.getInstance().getCotizacionDAO().getCotizacionIDPorFechaYempresaID(cotizacion.getFecha(), empresa.getID()));
								}
								if(DAOFactory.getInstance().getCotizacionDAO().insertOrModify(cotizacion)){
									filasImportadas++;
								} else {
									filasNoImportadas++;
								}
							} 
						} else  {
							isComplete = false;
							break;
						}
						
					}
				}
			}
			CotizacionTableItem item = new CotizacionTableItem();
			item.setFile(file);
			item.setCodigoEmpresa(codigoEmpresa);
			item.setCountImportedRows(filasImportadas);
			item.setCountNotImportedRows(filasNoImportadas);
			if(isComplete){
				addUploadedFile(item);
				item.setNombreEmpresa(empresa.getNombre());
				item.setNombreRubro(empresa.getRubro().getNombre());
			} else {
				addIncompleteFile(item);
			}
		} catch (Exception e) {
			logErrorInPopupWithoutDetail(e);
		} 
	}
	
	protected void parseHeaderColumn(Node rowNode) throws Exception {
		for (int j = 0; j < rowNode.getChildNodes().getLength(); j++) {
			Node cellNode = rowNode.getChildNodes().item(j);
			if (cellNode.getNodeType() == Node.ELEMENT_NODE){
				String columnValue = cellNode.getChildNodes().item(COLUMN_FIRST_ITEM).getTextContent();
				for(String key : propertyMap.keySet()){
					if(columnValue != null 
							&& !columnValue.equals("")
							&& propertyMap.get(key).contains(columnValue)
							&& propertyPositionMap.get(key) == -1){
						propertyPositionMap.put(key, j);
					}
				}
			}
		}
	}
	

}
